package top.wyloop.intoeins.module.iam.service;

import org.springframework.data.domain.Page;
import top.wyloop.intoeins.module.iam.model.entity.Permission;

import java.util.Date;
import java.util.List;

/**
 * @author Wyatt6
 * @date 2025/2/3
 */
public interface PermissionService {
    /**
     * 创建权限对象
     *
     * @param permission 新权限信息
     * @return 新权限对象
     */
    Permission createPermission(Permission permission);

    /**
     * 删除权限对象
     *
     * @param permissionId 要删除的权限ID
     */
    void deletePermission(Long permissionId);

    /**
     * 更新权限对象
     *
     * @param permission 新权限数据
     * @return 权限对象
     */
    Permission updatePermission(Permission permission);

    /**
     * 获取全量权限数据
     *
     * @return 全量权限数据
     */
    List<Permission> listPermissions();

    /**
     * 获取某角色的权限
     *
     * @param roleId 角色ID
     * @return 某角色的权限ID列表
     */
    List<Long> getPermissionIdsOfRole(Long roleId);

    /**
     * 条件查询权限分页
     *
     * @param pageNum    页码
     * @param pageSize   页大小
     * @param module     模块分组（模糊）
     * @param identifier 权限标识（模糊）
     * @param name       权限名称（模糊）
     * @param activated  生效状态
     * @param stTime     创建时间左边界（含）
     * @param edTime     创建时间右边界（含）
     * @return 权限分页数据
     */
    Page<Permission> getPermissionsByPageConditionally(
            int pageNum,
            int pageSize,
            String module,
            String identifier,
            String name,
            Boolean activated,
            Date stTime,
            Date edTime);

    /**
     * 查询某权限的排名
     *
     * @param permissionId 权限ID
     * @return 排名（从1开始）
     */
    Long getRowNum(Long permissionId);

    /**
     * 查询用户所有正在生效的权限标识
     *
     * @param userId 用户ID
     * @return 权限标识符列表
     */
    List<String> getActivatedPermissionIdentifiers(Long userId);

    /**
     * 更新PERMISSIONS_DB_REFRESHED时间戳
     */
    void setPermissionsDbRefreshed(Date timestamp);

    /**
     * 更新USER_PERMISSIONS_CACHE_REFRESHED时间戳
     */
    void setUserPermissionsCacheRefreshed(Long userId, Date timestamp);
}
